package Date_5_12;
import java.util.LinkedList;
import java.util.Scanner;

//迷宫BFS广度算法
//使用队列

public class maze_1 {
    static int[][] maze;
    static int x, y;//地图的大小
    static int[] addx={-1,1,0,0};//x向量增加量
    static int[] addy={0,0,-1,1};//y向量增加量
    //(-1,0)、(1,0)、(0,-1)、(0,1)想左，向右，向下，向上移动

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.println("输入地图的大小");
        x = in.nextInt();
        y = in.nextInt();
        maze = new int[x][y];
        System.out.println("输入地图");
        for (int i = 0; i < x; i++)
            for (int j = 0; j < y; j++)
                maze[i][j] = in.nextInt();
                //System.out.println(i+" "+ j+" "+maze[i][j]);
        System.out.println("输入入口，输入出口");
        int in_x = in.nextInt();
        int in_y = in.nextInt();
        int out_x = in.nextInt();
        int out_y = in.nextInt();
        System.out.println(BFS_1(in_x, in_y, out_x, out_y));
    }

    static int BFS_1(int x_1, int y_1, int out_x, int out_y) {
        LinkedList<Point> list = new LinkedList<Point>();
        Point point = new Point();
        point.setX(x_1);
        point.setY(y_1);
        point.setDis(0);
        list.add(point);
        maze[point.getX()][point.getY()]=1;
        while (!list.isEmpty()) {
            Point point_1 = list.getFirst();//取出第一个数
            System.out.println("("+point_1.getX()+","+point_1.getY()+")");
            list.removeFirst();//删除第一个数
            if(point_1.getX()==out_x&&point_1.getY()==out_y)
                return point_1.getDis();
            for(int i=0;i<4;i++ )
            {
                if(point_1.getX()+addx[i]<x && point_1.getX()+addx[i]>=0 && point_1.getY()+addy[i]<y &&
                point_1.getY()+addy[i]>=0 && maze[point_1.getX()+addx[i]][point_1.getY()+addy[i]]==0)
                    {
                        Point point_2=new Point();
                        point_2.setX(point_1.getX()+addx[i]);
                        point_2.setY(point_1.getY()+addy[i]);
                        point_2.setDis(point_1.getDis()+1);
                        maze[point_2.getX()][point_2.getY()]=1;//加入队列
                        list.add(point_2);
                    }
            }
        }
     return 0;
    }
}
class Point//节点
{
    private int x;//地图的x坐标
    private int y;//地图的有坐标
    private int dis;//在地图中需要的位置步数

    public int getDis() {
        return dis;
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }

    public void setDis(int dis) {
        this.dis = dis;
    }

    public void setX(int x) {
        this.x = x;
    }

    public void setY(int y) {
        this.y = y;
    }
}
